﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Bastanteo.Domain; 

namespace Bastanteo.Persistencia.ADO
{
    public class RolDAO : IRolDAO   
    {
        // Métodos CRUD
        public Rol Crear(Rol rolACrear)
        {
            string _Sentencia = "insert into Roles values (@RolId, @RolDescripcion)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@RolId", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@RolDescripcion", rolACrear.RolDescripcion));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Rol Obtener(int codigo)
        {
            string _Sentencia = "SELECT RolId, RolDescripcion FROM Roles WHERE RolId=@RolId";
            Rol rolCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@RolId", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            rolCreado = new Rol();
                            rolCreado.RolId = _Resultado.GetInt32(0);
                            rolCreado.RolDescripcion = (String)_Resultado["RolDescripcion"];
                        }
                    }
                }
            }
            return rolCreado;
        }
        public Rol Modificar(Rol rolAModificar)
        {
            string _Sentencia = "update Roles set RolDescripcion=@RolDescripcion where RolId=@RolId";
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@RolDescripcion", rolAModificar.RolDescripcion));
                    _Comando.Parameters.Add(new SqlParameter("@RolId", rolAModificar.RolId));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(rolAModificar.RolId);
        }
        public void Eliminar(Rol rolAEliminar)
        {
            string _Sentencia = "DELETE FROM Roles WHERE RolId=@RolId";
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@RolId", rolAEliminar.RolId));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        //Metodos Listar
        public ICollection<Rol> Listar()
        {
            string _Sentencia = "SELECT RolId, RolDescripcion FROM Roles";
            ICollection<Rol> localesEncontrados = new List<Rol>();
            Rol localEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            localEncontrado = new Rol();
                            localEncontrado.RolId = _Resultado.GetInt32(0);
                            localEncontrado.RolDescripcion = (String)_Resultado["RolDescripcion"];
                            localesEncontrados.Add(localEncontrado);
                        }
                    }
                }
            }
            return localesEncontrados;
        }
        public ICollection<Rol> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT RolId, RolDescripcion FROM Roles WHERE RolDescripcion LIKE '%'+@nombre+'%'";
            ICollection<Rol> localesEncontrados = new List<Rol>();
            Rol localEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            localEncontrado = new Rol();
                            localEncontrado.RolId = _Resultado.GetInt32(0);
                            localEncontrado.RolDescripcion = (String)_Resultado["RolDescripcion"];
                            localesEncontrados.Add(localEncontrado);
                        }
                    }
                }
            }
            return localesEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(rolid) FROM Roles";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}